package service

import (
	"errors"
	"fmt"
	
	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/model"
	"gitee.com/li-zhenyi/yi-nian-zhi-jian/backend/internal/repository"
)

// ItemService 定义物品服务接口
// 提供物品相关的业务逻辑处理

type ItemService interface {
	// GetInventory 获取用户的物品列表
	GetInventory(userID int64) ([]model.UserItem, error)
	
	// AddItem 给用户添加物品
	AddItem(userID int64, itemID int64, quantity int) error
	
	// RemoveItem 从用户物品栏移除物品
	RemoveItem(userID int64, itemID int64, quantity int) error
	
	// UseItem 使用物品并处理物品效果
	UseItem(userID int64, itemID int64) (string, error)
	
	// GetItem 获取物品详情
	GetItem(itemID int64) (*model.Item, error)
}

// itemService 实现物品服务接口

type itemService struct {
	itemRepo repository.ItemRepository
	userRepo repository.UserRepository
}

// NewItemService 创建一个新的物品服务实例
func NewItemService(itemRepo repository.ItemRepository, userRepo repository.UserRepository) ItemService {
	return &itemService{
		itemRepo: itemRepo,
		userRepo: userRepo,
	}
}

// GetInventory 获取用户的物品列表
func (s *itemService) GetInventory(userID int64) ([]model.UserItem, error) {
	return s.itemRepo.GetInventory(userID)
}

// AddItem 给用户添加物品
func (s *itemService) AddItem(userID int64, itemID int64, quantity int) error {
	// 验证物品是否存在
	item, err := s.itemRepo.GetItem(itemID)
	if err != nil {
		return err
	}
	if item == nil {
		return errors.New("物品不存在")
	}
	
	return s.itemRepo.AddItem(userID, itemID, quantity)
}

// RemoveItem 从用户物品栏移除物品
func (s *itemService) RemoveItem(userID int64, itemID int64, quantity int) error {
	// 验证用户是否拥有足够数量的物品
	inventory, err := s.itemRepo.GetInventory(userID)
	if err != nil {
		return err
	}
	
	found := false
	var userItem model.UserItem
	for _, item := range inventory {
		if item.ItemID == itemID {
			found = true
			userItem = item
			break
		}
	}
	
	if !found {
		return errors.New("你没有该物品")
	}
	
	if userItem.Quantity < quantity {
		return errors.New("物品数量不足")
	}
	
	return s.itemRepo.RemoveItem(userID, itemID, quantity)
}

// UseItem 使用物品并处理物品效果
func (s *itemService) UseItem(userID int64, itemID int64) (string, error) {
	// 获取物品信息
	item, err := s.itemRepo.GetItem(itemID)
	if err != nil {
		return "", err
	}
	if item == nil {
		return "", errors.New("物品不存在")
	}
	
	// 检查用户是否拥有该物品
	inventory, err := s.itemRepo.GetInventory(userID)
	if err != nil {
		return "", err
	}
	
	found := false
	for _, userItem := range inventory {
		if userItem.ItemID == itemID && userItem.Quantity > 0 {
			found = true
			break
		}
	}
	
	if !found {
		return "", errors.New("你没有该物品")
	}
	
	// 获取用户信息
	user, err := s.userRepo.GetByID(userID)
	if err != nil {
		return "", err
	}
	if user == nil {
		return "", errors.New("用户不存在")
	}
	
	// 处理物品效果
	var message string
	switch item.Name {
	case "培元丹":
		// 增加修为
		user.Cultivation += 100
		message = "你服用了培元丹，获得了100点修为！"
	case "回春丹":
		// 恢复气血
		user.HP = min(user.HP+50, 100) // 假设最大气血为100
		message = "你服用了回春丹，恢复了50点气血！"
	case "聚气丹":
		// 提升修炼效率（这里仅做记录，实际效果需要在修炼功能中实现）
		message = "你服用了聚气丹，30分钟内修炼效率提升50%！"
	case "定魂丹":
		// 提升突破成功率（这里仅做记录，实际效果需要在突破功能中实现）
		message = "你服用了定魂丹，突破境界成功率提升10%！"
	case "火球符":
		// 火球符效果（这里仅做示例）
		message = "你使用了火球符，释放出一道炽热的火焰！"
	case "隐身符":
		// 隐身符效果（这里仅做示例）
		message = "你使用了隐身符，身形变得模糊起来！"
	case "传送符":
		// 传送符效果（这里仅做示例）
		message = "你使用了传送符，瞬间移动到了安全区域！"
	default:
		// 无法使用的物品（如材料）
		message = fmt.Sprintf("%s是%s，不能直接使用", item.Name, item.Type)
		return message, nil
	}
	
	// 更新用户信息
	if err := s.userRepo.Update(user); err != nil {
		return "", err
	}
	
	// 消耗物品
	if err := s.itemRepo.UseItem(userID, itemID); err != nil {
		return "", err
	}
	
	return message, nil
}

// GetItem 获取物品详情
func (s *itemService) GetItem(itemID int64) (*model.Item, error) {
	return s.itemRepo.GetItem(itemID)
}

// min 返回两个整数中的较小值
func min(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}